package com.example.springboot.config.interceptors;

import com.example.springboot.config.anotation.requireduser.Required;
import org.springframework.messaging.handler.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Objects;

/**
 * 注册处理器拦截器
 * 拦截器流程：
 * ① 根据当前请求，找到可以处理请求以及handler所需要的的拦截器，封装为handlerChain类型返回
 * ② 先来顺序执行所有拦截器的preHandler方法，如果返回为true,则执行下一个拦截器的preHandler，如果返回为false，则倒序执行所有
 * 已经执行拦截器afterCompletion方法
 * ③ 如果任何一个拦截器执行失败，则跳出不执行目标方法
 * ④ 所有拦截器返回true，则执行目标方法
 * ⑤ 倒序执行所有拦截器的postHandle方法
 * ⑥ 前边有所有异常，都会直接触发afterCompletion
 *
 * @Author:ChenZhangKun
 * @Date: 2020/9/16 20:59
 */
public class LoginHandlerInterceptor implements HandlerInterceptor {
    /**
     * 目标方法执行之前
     *
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("进入拦截器");

        Object user = request.getSession().getAttribute("loginUser");
        if (user == null) {
            // 未登录
            request.setAttribute("msg", "没有权限，请先登录");
            // 转发到登录页面
            request.getRequestDispatcher("/index.html").forward(request, response);
            return false;
        }
        // 强转成handlerMethod
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        //
        boolean annotationPresent = handlerMethod.getMethod().isAnnotationPresent(Required.class);
        // 拿到登录人
        if (annotationPresent && !Objects.equals(user, "czk")) {
            System.out.println("需要czk才能访问");
            return false;
        }
        return true;
    }

    /**
     * 目标方法执行完成以后
     *
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    /**
     * 页面渲染以后
     *
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}
